#define  _CRT_SECURE_NO_WARNINGS 1
//#include"head.h"

//int main()
//{
//	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
//	printf("sizeof(arr) = %zd\n", sizeof(arr));//40
//	/*
//	其实数组名就是数组首元素(第一个元素)的地址是对的，但是有两个例外:
//		sizeof(数组名)，sizeof中单独放数组名，这里的数组名表示整个数组，计算的是整个数组的大小，单位是字节。
//		&数组名，这里的数组名表示整个数组，取出的是整个数组的地址(整个数组的地址和数组首元素的地址是有区别的)。
//	除此之外，任何地方使用数组名，数组名都表示首元素的地址。
//	*/
//
//	//						int*
//    printf("arr		= %p\n", arr);
//	printf("arr+1		= %p\n", arr+1);//+4
//
//	//							int*
//	printf("&arr[0]		= %p\n", &arr[0]);
//	printf("&arr[0]+1	= %p\n", &arr[0] + 1);//+4
//
//	//指针+1, 跳过几个字节，取决于指针的类型
//	//				数组指针类型：int(*) [10]
//    printf("&arr		= %p\n", &arr);
//	printf("&arr+1		= %p\n", &arr+1);//+40
//	//&arr+1是跳过整个数组，另外两个是跳过一个元素
//
//	return 0;
//}



//1、使用指针访问数组

//int main()
//{ 
//	int arr[10] = { 0 };
//	//1、给数组输入值
//	int i = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//	//2、输出数组
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p + i);
//	}
//
//    for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p + i));
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", p);
//        p++;
//	}
//
//    p = arr;//2、重新指向数组的开始
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(p));
//		p++;//1、不能直接p++，输入完之后，p已经指向了数组的末尾，不能再++了。
//		//如果直接p--, 可以倒序输出。
//	}
//
//	return 0;
//}

//int main()
//{
//	int arr[10] = { 0 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;;
//	int i = 0;
//	for (i = 0; i < sz; i++)
//	{
//		scanf("%d", &arr[i]);
//	}
//
// //   for (i = 0; i < sz; i++)
//	//{
//	//	printf("%d ", p[i]);//数组名可以当指针看待
//	//}
//	//// p[i] 和 *(p+i) 是等价的
//
//	for (i = 0; i < sz; i++)
//	{
//		printf("%d ", *(arr + i));//数组名可以当指针看待
//	}
//	//实际上，我们以数组下标形式访问数组的时候，编译器在处理的时候还是转换成指针的形式来处理。
//	// arr[i] --> *(arr + i) 
//
//	return 0;
//}


//int main()
//{
//	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int* p = arr;;
//	int i = 0;
//
//    for (i = 0; i < sz; i++)
//	{
//		//printf("%d ", arr[i]);//arr[i]-->*(arr + i)-->*(i + arr)
//        //printf("%d ", *(arr + i));
//        //printf("%d ", *(i + arr));
//        printf("%d ", i[arr]);
//	}
//	//[]是下标引用操作符，i, arr是操作数，没有什么特殊的。
//
//	return 0;
//}



//2、一维数组传参的本质

////         int* arr
////void test(int arr[10])//写成数组的形式，本质上是指针变量
//void test(int arr[])//可以省略大小，形参和实参是指向同一个数组，不会创建新的数组。
//{
//	int sz2 = sizeof(arr) / sizeof(arr[0]);
//	//           8               4
//    printf("sz2 = %d\n", sz2);//2
//}
//
//int main()
//{
//	int arr[10] = { 0 };
//    int sz1 = sizeof(arr) / sizeof(arr[0]);
//	//			40            4 
//	printf("sz1 = %d\n", sz1);//10
//
//	test(arr);
//	//arr是数组名，数组名是数组首元素的地址
//
//	return 0;
//}


//void test(int* arr)
//{
//	int sz2 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz2 = %d\n", sz2);//2
//
//	int i = 0;
//
//	for (i = 0; i < sz2; i++)//只靠数组名传参，无法获取元素个数，需要在传参时将数组元素个数一同传给函数
//	{
//		printf("%d ", *(arr + i));
//	}
//  //不要在函数里面求参数部分数组元素个数。
//
//    for (i = 0; i < 10; i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//}
//
//int main()
//{
//	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
//	int sz1 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz1 = %d\n", sz1);//10
//
//	test(arr);
//
//	return 0;
//}


//void test(int* arr, int sz)
//{
//	//int sz2 = sizeof(arr) / sizeof(arr[0]);
//	//printf("sz2 = %d\n", sz2);//2
//
//	int i = 0;
//
//	for (i = 0; i < sz; i++)//只靠数组名传参，无法获取元素个数，需要在传参时将数组元素个数一同传给函数
//	{
//		printf("%d ", *(arr + i));
//	}
//}
//
//int main()
//{
//	int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
//	int sz1 = sizeof(arr) / sizeof(arr[0]);
//	printf("sz1 = %d\n", sz1);//10
//
//	test(arr,sz1);
//
//	return 0;
//}


